package e_Executors;

import java.util.concurrent.*;

/**
 * 使用ExecutorService和Future演示并发计算的示例类。
 */
public class Example {
    public static void main(String[] args) {
        // 创建一个固定大小的线程池，最多同时执行两个任务
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 提交一个Callable任务，并获取Future对象以异步获取任务结果
        Future<String> future = executorService.submit(new MyCallable_Example());

        // 提交一个Runnable任务，不关心返回结果
        executorService.submit(new MyRunnable_Example());

        try {
            // 尝试获取前面提交的Callable任务的结果
            System.out.println(future.get());
        } catch (ExecutionException e) {
            // 处理任务执行中产生的异常
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            // 处理线程被中断的异常
            throw new RuntimeException(e);
        }

        // 关闭线程池，等待所有任务完成
        executorService.shutdown();
    }
}

/**
 * 实现Runnable接口的示例任务类，用于进行简单的计算。
 */
class MyRunnable_Example implements Runnable {
    public void run() {
        // 进行简单的累加计算
        int sum = 0;
        for (int i = 1; i < 100; i++) {
            sum = sum + i;
        }

        // 打印当前线程名称和计算结果
        System.out.println(Thread.currentThread().getName() + ":" + sum);
    }
}

/**
 * 实现Callable接口的示例任务类，用于返回一个字符串结果。
 */
class MyCallable_Example implements Callable<String> {
    @Override
    public String call() throws Exception {
        // 返回一个测试字符串
        return "这是一个测试";
    }
}
